package studentsinfomanagement.util;

import studentsinfomanagement.AppConstants;

import java.sql.*;

/**
 * 数据库工具类
 *
 */
public class DBUtil {
    private static DBUtil db;
    private Connection conn;
    private PreparedStatement ps;
    private ResultSet rs;

    /**
     * 不允许外部创造DBUtil类对象
     */
    private DBUtil() {
        conn = getConn();//连接数据库
    }

    /**
     * 单例模式获取DBUtil类的实例
     * @return DBUtil类实例
     */
    public static DBUtil getDBUtil() {
        if (db == null) {
            db = new DBUtil();
        }
        return db;
    }

    /**
     * 私有的获取数据库连接对象方法
     * @return
     */
    private Connection getConn() {
        try {
            if (conn == null || conn.isClosed()) {
                Class.forName(AppConstants.JDBC_DRIVER);
                conn = DriverManager.getConnection(AppConstants.JDBC_URL, AppConstants.JDBC_USERNAME, AppConstants.JDBC_PASSWORD);
            }
        } catch (ClassNotFoundException e) {
            System.out.println("jdbc driver is not found.");
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 关闭数据库连接
     */
    public void close() {
        try {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 执行数据库更新
     * @param sql 要执行的sql语句
     * @return 返回执行结果
     */
    public int executeUpdate(String sql) {
        int result = -1;
        if (getConn() == null) {
            return result;
        }
        try {
            ps = conn.prepareStatement(sql);
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 执行数据库更新（有参数）
     * @param sql 要执行的sql语句
     * @param obj 参数
     * @return 返回执行结果
     */
    public int executeUpdate(String sql, Object[] obj) {
        int result = -1;
        if (getConn() == null) {
            return result;
        }
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                ps.setObject(i + 1, obj[i]);
            }
            result = ps.executeUpdate();
            close();
        } catch (SQLException e) {
            e.printStackTrace();
            result = -1;
        }
        return result;
    }

    /**
     * 执行数据库查询
     * @param sql 要执行的sql语句
     * @return 查询结果
     */
    public ResultSet executeQuery(String sql) {
        if (getConn() == null) {
            return null;
        }
        try {
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }

    /**
     * 执行数据库查询（带参数）
     * @param sql 要执行的语句
     * @param obj 参数
     * @return 查询结果
     */
    public ResultSet executeQuery(String sql, Object[] obj) {
        if (getConn() == null) {
            return null;
        }
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                ps.setObject(i + 1, obj[i]);
            }
            rs = ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return rs;
    }

    /**
     * 执行sql语句
     * @param sql 要执行的sql语句
     * @return 执行结果
     */
    public boolean exeute(String sql) {
        if (getConn() == null) {
            return false;
        }
        try {
            Statement statement = conn.createStatement();
            statement.execute(sql);
            statement.close();
            return true;
        } catch (SQLException e) {
//			e.printStackTrace();
            return false;
        }
    }
}
